//File copy with buffer size.
//By DreamVB

#include <iostream>

using namespace std;
using std::cout;
using std::endl;

#define BUFFER_SIZE 1024

int main(int argc, char *argv[]){
	FILE *fin = NULL;
	FILE *fout = NULL;
	char *Buffer = NULL;
	size_t BytesRead = 0;
	rsize_t BytesWrite = 0;

	//Check args
	if (argc != 3){
		cout << "Usage " << argv[0] << " <source> <destination>" << endl;
		exit(1);
	}

	//Open source file.
	fin = fopen(argv[1], "rb");

	if (!fin){
		cout << "IO/Error cannot open source file." << endl;
		exit(1);
	}

	fout = fopen(argv[2], "wb");

	if (!fout){
		cout << "IO/Error cannot write destination file." << endl;
		fclose(fin);
		exit(1);
	}

	//Resize Buffer
	Buffer = new char[BUFFER_SIZE];
	//Do file copy.

	//Get first data
	BytesRead = fread(Buffer, sizeof(char), BUFFER_SIZE, fin);

	//While not end of file read
	while (!feof(fin)){
		//Write data
		BytesWrite = fwrite(Buffer, sizeof(char), BytesRead, fout);
		//Read in new data.
		BytesRead = fread(Buffer, sizeof(char), BUFFER_SIZE, fin);
	}
	//Write remaining data.
	BytesWrite = fwrite(Buffer, sizeof(char), BytesRead, fout);

	//Tidy up time.
	fclose(fout);
	fclose(fin);
	delete[]Buffer;

	return 0;
}